package com.boulderai.mcp.client;

import com.boulderai.mcp.model.McpMessage;
import com.boulderai.mcp.model.Resource;
import com.boulderai.mcp.model.Tool;
import com.fasterxml.jackson.databind.JsonNode;

import java.util.List;
import java.util.concurrent.CompletableFuture;

/**
 * MCP客户端接口
 * 定义了与MCP服务器交互的核心方法
 */
public interface McpClient {
    
    /**
     * 连接到MCP服务器
     * @param serverUri 服务器URI
     * @return 连接结果的Future
     */
    CompletableFuture<Void> connect(String serverUri);
    
    /**
     * 断开与服务器的连接
     * @return 断开连接结果的Future
     */
    CompletableFuture<Void> disconnect();
    
    /**
     * 检查是否已连接
     * @return 连接状态
     */
    boolean isConnected();
    
    /**
     * 初始化会话
     * @param clientInfo 客户端信息
     * @return 初始化结果的Future
     */
    CompletableFuture<JsonNode> initialize(JsonNode clientInfo);
    
    /**
     * 获取服务器支持的工具列表
     * @return 工具列表的Future
     */
    CompletableFuture<List<Tool>> listTools();
    
    /**
     * 调用工具
     * @param toolName 工具名称
     * @param arguments 工具参数
     * @return 工具执行结果的Future
     */
    CompletableFuture<JsonNode> callTool(String toolName, JsonNode arguments);
    
    /**
     * 获取服务器支持的资源列表
     * @return 资源列表的Future
     */
    CompletableFuture<List<Resource>> listResources();
    
    /**
     * 读取资源内容
     * @param resourceUri 资源URI
     * @return 资源内容的Future
     */
    CompletableFuture<JsonNode> readResource(String resourceUri);
    
    /**
     * 发送自定义请求
     * @param method 方法名
     * @param params 参数
     * @return 响应结果的Future
     */
    CompletableFuture<JsonNode> sendRequest(String method, JsonNode params);
    
    /**
     * 发送通知消息
     * @param method 方法名
     * @param params 参数
     */
    void sendNotification(String method, JsonNode params);
    
    /**
     * 设置消息处理器
     * @param handler 消息处理器
     */
    void setMessageHandler(McpMessageHandler handler);
    
    /**
     * 消息处理器接口
     */
    interface McpMessageHandler {
        /**
         * 处理接收到的消息
         * @param message 接收到的消息
         */
        void onMessage(McpMessage message);
        
        /**
         * 处理连接错误
         * @param error 错误信息
         */
        void onError(Throwable error);
        
        /**
         * 处理连接关闭
         * @param code 关闭代码
         * @param reason 关闭原因
         */
        void onClose(int code, String reason);
    }
}